package com.ionehe.group.common.wechat;

import cn.hutool.json.JSONObject;
import com.ionehe.group.common.wechat.enums.WechatEnv;
import com.ionehe.group.common.wechat.model.PhoneInfoResponse;

import java.util.Map;

/**
 * @author 2022/1/7 <a href="mailto:a@ionehe.com">xiu</a>
 */
public interface WechatService {
    /**
     * 通过code获取openid
     *
     * @param code 授权码
     * @param env  环境（微信公众号、微信小程序）
     * @return openid
     */
    String getOpenid(String code, WechatEnv env);

    /**
     * 通过code获取session key
     *
     * @param code 授权码
     * @return session key
     */
    String getSessionKey(String code);

    /**
     * 获取用户手机号信息
     *
     * @param code 授权码
     * @return 手机号信息
     */
    PhoneInfoResponse.PhoneInfo getUserPhoneInfo(String code);

    /**
     * 获取小程序码，适用于需要的码数量极多的业务场景。通过该接口生成的小程序码，永久有效，数量暂无限制。
     *
     * @param page  页面 page，例如 pages/index/index，根路径前不要填加 /，不能携带参数（参数请放在scene字段里），如果不填写这个字段，默认跳主页面
     * @param width 二维码的宽度，单位 px，最小 280px，最大 1280px，默认280px
     * @param param 最大32个可见字符，只支持数字，大小写英文以及部分特殊字符：!#$&'()*+,/:;=?@-._~，其它字符请自行编码为合法字符（因不支持%，中文无法使用 urlencode 处理，请使用其他编码方式）
     * @return 二维码字节流
     */
    Byte[] getQrCodeUnLimit(String page, Integer width, Map<String, String> param);

    /**
     * 数据解密
     *
     * @param code          授权码
     * @param encryptedData 密文数据
     * @param iv            iv
     * @return 明文的jsonObject
     */
    JSONObject decryptData(String code, String encryptedData, String iv);
}
